#include<iostream>
#include<fstream>
#include<vector>
#include "Grafo.h"

int main( int argc, char* argv[] ){
    
    unsigned cantNodos,
             cantArcos;
    
    ifstream archivoIN(argv[1]);
    //ifstream archivoIN("lala.in");
    //entrada
    archivoIN >> cantNodos;
    archivoIN >> cantArcos;
    
    Grafo<char> graph(cantNodos);

    int nodoA, nodoB;
    
    for(unsigned arco = 0; arco < cantArcos; arco++){
        archivoIN >> nodoA;
        archivoIN >> nodoB;

        graph.agregarArco( nodoA , nodoB , 1 );
        graph.agregarArco( nodoB , nodoA , 1 );
    }
    


    archivoIN.close();

    vector<unsigned> ordNodos;
    vector< list<unsigned> > colores;
    
    for( unsigned i = 1 ; i <= cantNodos ; i++ )
        ordNodos.push_back(i);
    

    cout << "\nColores " << graph.coloreo( ordNodos , colores ) << endl;

    list<unsigned>::iterator lstIt;
    
    ofstream archivoOUT(argv[2]);
    
    archivoOUT << colores.size() -  1 << endl;
    
    for( unsigned i = 1 ; i < colores.size() ; i++ ){
        
        archivoOUT << i << " " << colores[i].size() << endl;
        
        for( lstIt = colores[i].begin() ; lstIt != colores[i].end() ; lstIt++ )
            archivoOUT << *lstIt << " ";
        
        archivoOUT << endl;
        
    }
    
    archivoOUT.close();
    
    return 0;
}